/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ComExWeb.service;

import ComExWeb.dominio.security.Recurso;
import ComExWeb.dominio.security.Grupo;
import ComExWeb.dominio.security.Usuario;
import ComExWeb.exception.LoginException;
import ComExWeb.util.StringUtil;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author 
 */
@Stateless
public class SecurityService {

    @EJB
    private CRUDService crudService;
    private Usuario user;
    private Recurso paginaCadastrada;

    public void inicializaAtributos(Usuario user, String urlPagina) {
        this.user = user;
        this.paginaCadastrada = findRecurso(urlPagina);
    }

    private Recurso findRecurso(String currentPage) {
        Recurso res = (Recurso) crudService.executeQuerySingleResult("select o from Recurso o where o.url = ?1", currentPage);
        return res;
    }

    public Usuario findUsuario(String login) {
        Usuario u = (Usuario) crudService.executeQuerySingleResult("select o from Usuario o where o.login = ?1", login);
        return u;
    }

    public boolean isPaginaCadastrada() {
        return paginaCadastrada != null;
    }

    public boolean isPaginaPublica() {
        return paginaCadastrada.getPublico();
    }

    public boolean isUsuarioAutenticado() {
        return user != null;
    }

    public boolean isUsuarioAutorizado() {
        return paginaCadastrada.isAutorizado(user);
    }

    public Object salvaGrupo(Object obj) {
        Grupo grupo = (Grupo) obj;
        grupo = crudService.save(grupo);
        crudService.executeNativeUpdate("delete from perfil where grupo = ?1", grupo.getIdGrupo());
        for (Usuario u2 : grupo.getUsuarios()) {
            crudService.executeNativeUpdate("insert into perfil (grupo, usuario) values (?1, ?2)", grupo.getIdGrupo(), u2.getId());
        }        
        return grupo;
    }

    public Usuario login(String username, String senha) {
        try {
            StringUtil su = new StringUtil();
            String senhaCifrada = su.md5(senha);
            Usuario u = (Usuario) crudService.executeQuerySingleResult("select u from Usuario u where u.login = ?1 and u.senha = ?2", username, senhaCifrada);
            if (u == null) {
                throw new LoginException("Usuário e/ou Senha inválidos.", null);
            }
            return u;
        } catch (Exception e) {
            if (e instanceof LoginException) {
                throw (LoginException)e;
            } else {
                throw new LoginException("Não foi possível fazer a autenticação no sistema.", e);
            }
        }
    }
}
